看同隊的都先打動機,那我就也模仿一下,反正也沒為什麼,同學缺人,就加啦!
leetcode有3個等級的難度:Easy, Medium, Hard,會各10題。
我只能說不好說,因為隨便挑題,可能會學到一些基本的資料結構或演算法,也可能不小心挑到兩數字和這種簡單的題目,造成你感到會覺得很廢,但我會努力的。
之後都是會先講講一些概念,然後各種解法,主要用C++。
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
in-place 即是將更新的資料寫入相同的記憶體位址上。
out of place 即是將更新的資料寫入到別的記憶體位址上。
在C++的話,輸入參數是vector,能使用vector的erase,那很直觀的,我們就從第一個數字開始與下個數字比較,重複則刪除,直到不一樣為止,在以下個數字重複這件事。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 1;
while(i < nums.size()){
if(nums[i] == nums[i-1]){
nums.erase(nums.begin()+i-1);
}
else{
i++;
}
}
return nums.size();
}
};
但是用直接用erase非常的低效,因為erase會把後面的數字都往前搬移。
所以使用2個變數當作旗標(如下的i和j), j指著當前數字,i則指著下個數字,一樣做比較,但重複不刪除,直接跳過,直到不同再更新。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() <= 1) {
return nums.size();
}
int size = 0;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] != nums[size]) {
nums[++size] = nums[i];
}
}
return size + 1;
}
};
這樣就能提高效能囉!
今天就先這樣,拜拜!